#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20

/*
函数功能：使用动态内存分配的方式申请n个元素的指针数组，每个指针指向读入的药品名称字符串，每个字符串也需要使用动态内存分配的方式分配空间，返回动态申请的指针数组
参数说明：n为药品的名称的个数
返回值：动态申请的指针数组的起始地址
*/
char **InputDrugName(unsigned int n);//函数声明
/*
函数功能：按题目要求对n个药品名称进行整理
参数说明：Drugstrs存储药品名称的指针数组的起始地址，n为药品名称的个数
无返回值
*/
void OrganizeDrugs(char **Drugstrs, unsigned int n);
/*
函数功能：按题目要求对1个药品名称进行整理
参数说明：Drugname为药品名称字符串的起始地址
返回值：整理好后的药品名称的字符串的起始地址
*/
char *OrganizeOneDrugname(char *Drugname);
/*
函数功能：打印药品名称
参数说明：Drugstrs存储药品名称的指针数组的起始地址，n为药品名称的个数
无返回值
*/
void PrintDrug(char **Drugstrs, unsigned int n);
/*
函数功能：释放动态申请的存储药品名称的指针数组
参数说明：Drugstrs存储药品名称的指针数组的起始地址，n为药品名称的个数
无返回值
*/
void FreeDrug(char **Drugstrs, unsigned int n);

int main()
{
     unsigned int n;
     printf("Plese input number of durgs:\n");
     scanf("%u", &n);
     char **DrugStrs = InputDrugName(n);
     OrganizeDrugs(DrugStrs, n);
     printf("After Organized:\n");
     PrintDrug(DrugStrs, n);
     FreeDrug(DrugStrs, n);
     return 0;
}
void OrganizeDrugs(char **Drugstrs, unsigned int n)
{

    for (char **p = Drugstrs; p < Drugstrs + n; p++)
    {
       *p = OrganizeOneDrugname(*p);//引用函数
    }
}
void FreeDrug(char **Drugstrs, unsigned int n)
{
    if (Drugstrs != NULL)
    {
         for (char **p = Drugstrs; p < Drugstrs + n; p++)
        {
             if (*p != NULL)
             free(*p);//释放空间
        }
         free(Drugstrs);
    }
}
char **InputDrugName(unsigned int n)
{
     char **space = (char **)malloc(n * sizeof(char));
                        // 申请空间
     if (space == NULL) // 判断得到的结果是否正确
    {
         return NULL;
    }
     printf("Please input the name of drugs:\n");
     for (int i = 0; i < n; i++)
    {
        scanf("%19s", space[i] = (char *)malloc(N * sizeof(char)));
    }
     return space;
}
char *OrganizeOneDrugname(char *Drugname)
{
     int len = strlen(Drugname);
     if (*Drugname >= 'a' && *Drugname <= 'z')
    {
         *Drugname = (*Drugname - 'a') % 26 + 'A';//大小写转换
    }
    for (int i = 1; i < len; i++)
    {
        if (*(Drugname + i) >= 'A' && *(Drugname + i) <= 'Z')//判断条件
        {
             *(Drugname + i) = (*(Drugname + i) - 'A') % 26 + 'a';//大小写转换
        }
    }
     return Drugname;
}
void PrintDrug(char **Drugstrs, unsigned int n)
{
     for (int i = 0; i < n; i++)
    {
         printf("%s\n", *(Drugstrs + i)); // 输出结果
    }
}